﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Studio7i.CapaDominio;

namespace Studio7i.CapaPersistencia.DAO
{
    public class ArmadoDeReservaDAO: IArmadoReservaDAO
    {

        // Dependencias
        IInstrumentoDAO InstrumentoDAO = new InstrumentoDAO();
        IServicioDAO ServicioDAO = new ServicioDAO();
        IReservaDAO ReservaDAO = new ReservaDAO();


        // Métodos CRUD
        /**********************************************************************************************************/
        public ArmadoDeReserva Crear(ArmadoDeReserva ArmadoReservaACrear)
        {
            string _Sentencia = @"INSERT INTO Armado_Reserva VALUES(@codigo,@ssarmado,@reserva,@instrumento,@servicio)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@ssarmado", ArmadoReservaACrear.SsArmado));
                    _Comando.Parameters.Add(new SqlParameter("@reserva", ArmadoReservaACrear.Reserva.CoReserva));
                    _Comando.Parameters.Add(new SqlParameter("@instrumento", ArmadoReservaACrear.Instrumento.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@servicio", ArmadoReservaACrear.Servicio.codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        /**********************************************************************************************************/
        public ArmadoDeReserva Obtener(int codigo)
        {
            string _Sentencia = @"SELECT * FROM Armado_Reserva WHERE CoArmRes=@codigo";
            ArmadoDeReserva ArmadoReservaCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            ArmadoReservaCreado = new ArmadoDeReserva();
                            ArmadoReservaCreado.CoArmRes = (int)_Resultado["CoArmRes"];
                            ArmadoReservaCreado.SsArmado = (decimal)_Resultado["ssarmado"];
                            ArmadoReservaCreado.Reserva = ReservaDAO.Obtener((int)_Resultado["CoReserva"]);
                            ArmadoReservaCreado.Instrumento = InstrumentoDAO.Obtener((int)_Resultado["CoInstrumento"]);
                            ArmadoReservaCreado.Servicio = ServicioDAO.Obtener((int)_Resultado["CoServicios"]);
                        }
                    }
                }
            }
            return ArmadoReservaCreado;
        }

        /**********************************************************************************************************/
        public ArmadoDeReserva Modificar(ArmadoDeReserva ArmadoReservaAModificar)
        {
            string _Sentencia = @"UPDATE Armado_Reserva SET SsArmado=@ssarmado, CoReserva=@reserva, CoInstrumento=@instrumento, CoServicios=@servicio WHERE CoArmRes=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@ssarmado", ArmadoReservaAModificar.SsArmado));
                    _Comando.Parameters.Add(new SqlParameter("@reserva", ArmadoReservaAModificar.Reserva.CoReserva));
                    _Comando.Parameters.Add(new SqlParameter("@instrumento", ArmadoReservaAModificar.Instrumento.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@servicio", ArmadoReservaAModificar.Servicio.codigo));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", ArmadoReservaAModificar.CoArmRes));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(ArmadoReservaAModificar.CoArmRes);
        }

        /**********************************************************************************************************/
        public void Eliminar(ArmadoDeReserva ReservaAEliminar)
        {
            string _Sentencia = "DELETE FROM Armado_Reserva WHERE CoArmRes=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", ReservaAEliminar.CoArmRes));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        /**********************************************************************************************************/
        // Métodos Listar
        public ICollection<ArmadoDeReserva> ListarTodos()
        {
            string _Sentencia = "SELECT * FROM Armado_Reserva";
            ICollection<ArmadoDeReserva> ArmadoReservasEncontrados = new List<ArmadoDeReserva>();
            ArmadoDeReserva ArmadoReservaEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ArmadoReservaEncontrado = new ArmadoDeReserva();
                            ArmadoReservaEncontrado.CoArmRes = (int)_Resultado["CoArmRes"];
                            ArmadoReservaEncontrado.SsArmado = (decimal)_Resultado["ssarmado"];
                            ArmadoReservaEncontrado.Reserva = ReservaDAO.Obtener((int)_Resultado["CoReserva"]);
                            ArmadoReservaEncontrado.Instrumento = InstrumentoDAO.Obtener((int)_Resultado["Coinstrumento"]);
                            ArmadoReservaEncontrado.Servicio = ServicioDAO.Obtener((int)_Resultado["CoServicios"]);
                            ArmadoReservasEncontrados.Add(ArmadoReservaEncontrado);
                        }
                    }
                }
            }
            return ArmadoReservasEncontrados;
        }

        /**********************************************************************************************************/
        public ICollection<ArmadoDeReserva> ListarXBusqueda(int? codigo, decimal ssarmado, Reserva reserva, Instrumento instrumento, Servicio servicio)
        {
            string _Sentencia = @"SELECT * FROM Armado_Reserva WHERE CoArmRes=1";
            ICollection<ArmadoDeReserva> ArmadoReservasEncontrados = new List<ArmadoDeReserva>();
            ArmadoDeReserva ArmadoReservaEncontrado = null;

            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND CoReserva=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (ssarmado != 0)
                    {
                        _Sentencia = _Sentencia + " AND ssarmado = @ssarmado";
                        _Comando.Parameters.Add(new SqlParameter("@ssarmado", ssarmado));
                    }
                    if (reserva != null)
                    {
                        _Sentencia = _Sentencia + " AND CoReserva = reserva";
                        _Comando.Parameters.Add(new SqlParameter("@reserva", reserva.CoReserva));
                    }
                    if (instrumento != null)
                    {
                        _Sentencia = _Sentencia + " AND CoInstrumento=@instrumento";
                        _Comando.Parameters.Add(new SqlParameter("@instrumento", instrumento.codigo));
                    }
                    if (servicio != null)
                    {
                        _Sentencia = _Sentencia + " AND CoServicio=@instrumento";
                        _Comando.Parameters.Add(new SqlParameter("@servicio", servicio.codigo));
                    }
 
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;

                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ArmadoReservaEncontrado = new ArmadoDeReserva();
                            ArmadoReservaEncontrado.CoArmRes = (int)_Resultado["CoArmRes"];
                            ArmadoReservaEncontrado.SsArmado = (decimal)_Resultado["ssarmado"];
                            ArmadoReservaEncontrado.Reserva = ReservaDAO.Obtener((int)_Resultado["Coreserva"]);
                            ArmadoReservaEncontrado.Instrumento = InstrumentoDAO.Obtener((int)_Resultado["Coinstrumento"]);
                            ArmadoReservaEncontrado.Servicio = ServicioDAO.Obtener((int)_Resultado["CoServicios"]);
                            ArmadoReservasEncontrados.Add(ArmadoReservaEncontrado);
                        }
                    }
                }
            }
            return ArmadoReservasEncontrados;
        }

        /**********************************************************************************************************/
        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoArmRes) FROM Armado_Reserva";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}